package org.papervision3d.view
{
	import org.papervision3d.cameras.SpringCamera3D;	
	import org.papervision3d.cameras.Camera3D;
	import org.papervision3d.cameras.CameraType;
	import org.papervision3d.cameras.DebugCamera3D;
	import org.papervision3d.core.view.IView;
	import org.papervision3d.objects.DisplayObject3D;
	import org.papervision3d.render.BasicRenderEngine;
	import org.papervision3d.scenes.Scene3D;

	/**
	 * <span lang="ja">
	 * BasicView は、Papervision3D のプロジェクトを簡単にセットアップすることができるクラスです。
	 * シーン、カメラ、レンダラー、ビューポートのシンプルなテンプレートを提供しています。
	 * BasicView は Sprite のサブクラスであり、どんな DisplayObject にも加える事ができます。
	 * </span>
	 * <span lang="en">
	 * BasicView provides a simple template for quickly setting up
	 * basic Papervision3D projects by creating a viewport, scene,
	 * camera, and renderer for you. Because BasicView is a subclass of
	 * Sprite, it can be added to any DisplayObject.
	 * </span>
	 * 
	 * @author Ralph Hauwert
	 */
	public class BasicView extends AbstractView implements IView
	{
		/**
		* <span lang="ja">新しい BasicView インスタンスを作成します。</span>
		* @param viewportWidth		ビューポートの幅です。
		* @param viewportHeight	ビューポートの高さです。
		* @param scaleToStage		ビューポートをステージに合わせるかどうかのフラグです。
		* @param interactive		シーンがインタラクティブかどうかの設定です。3Dオブジェクトにマウスイベントを登録する場合は、trueを設定します。
		* @param cameraType		カメラのタイプを指定します。
		* 
		* @see org.papervision3d.cameras.CameraType
		*
		* @example 
		* 
		* 次の例は、BasicView　クラスを継承したサブクラスを生成する場合のコードです。
		* <div class="listing">
		* <pre>
		* package {
		* 	import org.papervision3d.view.BasicView;
		* 	import org.papervision3d.objects.primitives.Sphere;
		* 	public class Main extends BasicView {
		* 		public function Main() {
		* 			super( 0, 0, true, true, CameraType.TARGET );
		* 			
		* 			var obj:Sphere = new Sphere();
		* 			scene.addChild(obj);
		* 
		* 			startRendering();
		* 		}
		* 	}
		* }
		* </pre>
		* </div>
		* 
		* 次の例は、BasicView　クラスをインスタンスとして利用する場合のコードです。
		* <div class="listing">
		* <pre>
		* var width:Number = 640;
		* var heigth:Number = 480;
		* var scaleToStage:Boolean = true;
		* var interactive:Boolean = true;
		* var cameraType:String = Camera3D.TYPE;
		* 
		* var myBasicView:BasicView = new BasicView(width, height, scaleToStage, interactive, cameraType);
		* myDisplayObject.addChild(myBasicView);
		* </pre>
		* </div>
		*/	
		public function BasicView(viewportWidth:Number = 640, viewportHeight:Number = 480, scaleToStage:Boolean = true, interactive:Boolean = false, cameraType:String = "Target")
		{
			super();
			
			scene = new Scene3D();
			viewport = new Viewport3D(viewportWidth, viewportHeight, scaleToStage, interactive);
			addChild(viewport);
			renderer = new BasicRenderEngine();
			
			switch(cameraType)
			{
				case CameraType.DEBUG:
					_camera = new DebugCamera3D(viewport);
					break;
				case CameraType.TARGET:
					_camera = new Camera3D(60);
					_camera.target = DisplayObject3D.ZERO;
					break;
				case CameraType.SPRING:
					_camera = new SpringCamera3D();
					_camera.target = DisplayObject3D.ZERO;		
					break;			
				case CameraType.FREE:
				default:
					_camera = new Camera3D(60);
					break;
			}
			
			cameraAsCamera3D.update(viewport.sizeRectangle);
		}
		
        /**
         * <span lang="ja">camera インスタンスを Camera3D 型として取得します。</span>
		 * <span lang="en">Exposes the camera as a <code>Camera3D</code></span>
         */
        public function get cameraAsCamera3D():Camera3D
        {
                return _camera as Camera3D;
        }
        
        /**
         * <span lang="ja">camera インスタンスを DebugCamera3D 型として取得します。</span>
		 * <span lang="en">Exposes the camera as a <code>DebugCamera3D</code></span>
         */
        public function get cameraAsDebugCamera3D():DebugCamera3D 
        {
                return _camera as DebugCamera3D;
        }
	}
}